<?php
namespace core\proxy;

use core\utils\Bean;
use Exception;
use ReflectionClass;
use ReflectionMethod;

interface DaemonProxy extends Bean {
    /**
     * 這個方法用來確定那些類是需要被代理的，
     * 如果不需要代理的類，那在實例化的時候，就不會帶上代理類的信息
     * @param ReflectionClass $class
     * @return bool
     */
    function matchClass(ReflectionClass $class) : bool;

    /**
     * 這個方法是用來類的那些方法是會被代理的，
     * 需要matchClass和matchMethod同時滿足的時候才會執行下方的其他方法
     * @param ReflectionMethod $method
     * @return bool
     */
    function matchMethod(ReflectionMethod $method) : bool;
    function doBefore($args, ReflectionClass $class, ReflectionMethod $method);
    function doAfter();
    function doThrow(Exception $e);
    function doFinally();
    function doBeforeReturn($o);
}